#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
from abc import ABC, abstractmethod
from typing import Dict, List, Any, BinaryIO, Tuple, Optional

logger = logging.getLogger(__name__)

class BaseEngine(ABC):
    """文档处理引擎基类，定义所有文档处理引擎的公共接口"""
    
    def __init__(self, config: Dict[str, Any]):
        """初始化引擎
        
        Args:
            config: 引擎配置信息
        """
        if not isinstance(config, dict):
            raise ValueError("配置必须是字典类型")
            
        if "document" not in config:
            raise ValueError("配置中缺少 'document' 部分")
            
        if "supported_formats" not in config["document"]:
            raise ValueError("配置中缺少 'document.supported_formats'")
            
        self.config = config
        logger.info(f"初始化引擎: {self.__class__.__name__}")
        logger.info(f"支持的文档格式: {', '.join(config['document']['supported_formats'])}")
    
    @abstractmethod
    async def convert_to_markdown(
        self, 
        file_content: BinaryIO, 
        file_name: str,
        image_option: str = "obs",
        work_dir: Optional[str] = None
    ) -> Dict[str, Any]:
        """将文档转换为Markdown格式
        
        Args:
            file_content: 文件内容（二进制流）
            file_name: 文件名
            image_option: 图片处理选项，可选值："obs"（上传到OBS）或"remove"（移除图片）
            work_dir: 工作目录路径，如果提供则使用此目录，否则创建临时目录
            
        Returns:
            包含以下键的字典:
                - text: 提取的纯文本
                - markdown: 转换后的Markdown文本
                - images: 图片信息列表
                - temp_dir: 临时目录路径
        """
        pass
    
    @abstractmethod
    async def extract_images(
        self, 
        file_content: BinaryIO,
        file_name: str
    ) -> Tuple[List[Dict[str, Any]], Optional[str]]:
        """从文档中提取图片
        
        Args:
            file_content: 文件内容（二进制流）
            file_name: 文件名
            
        Returns:
            Tuple[图片信息列表, 临时目录路径]
        """
        pass
    
    @abstractmethod
    async def handle_images(
        self, 
        images: List[Dict[str, Any]], 
        markdown_text: str,
        uploader
    ) -> str:
        """处理图片（上传到OBS并更新Markdown中的图片引用）
        
        Args:
            images: 图片信息列表
            markdown_text: Markdown文本
            uploader: OBS上传器实例
            
        Returns:
            更新后的Markdown文本（图片引用已替换为OBS URL）
        """
        pass 